package com.durian.utils;

import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * PageInfo 属性优化工具
 *
 * @author Durian
 * @since 2023/12/7
 */
@Data
@Builder
@AllArgsConstructor
public class PageInfoResult<R> implements Serializable {

    /**
     * 页码数
     */
    private Integer pageNum;

    /**
     * 每页大小
     */
    private Integer pageSize;

    /**
     * 总条数
     */
    private Long total;

    /**
     * 数据
     */
    private List<R> list;

    /**
     * 将pageInfo中的集合转换成clazz类型
     *
     * @param pageInfo pageInfo
     * @param clazz    泛型
     * @return 处理后的pageInfo
     */
    public static <PO, VO> PageInfoResult<VO> of(PageInfo<PO> pageInfo, Class<VO> clazz) {
        List<VO> voList = BeanListUtils.copyListUtil(pageInfo.getList(), clazz);
        return new PageInfoResult<>(
                pageInfo.getPageNum(),
                pageInfo.getSize(),
                pageInfo.getTotal(),
                voList
        );
    }

    /**
     * 数据封装
     *
     * @param pageInfo 分页数据
     * @return 返回优化后的数据
     */
    public static <R> PageInfoResult<R> of(PageInfo<R> pageInfo) {
        return new PageInfoResult<>(
                pageInfo.getPageNum(),
                pageInfo.getSize(),
                pageInfo.getTotal(),
                pageInfo.getList()
        );
    }


    /**
     * 根据处理方式对list进行特定处理
     *
     * @param pageInfo 分页数据
     * @param mapper   处理方式
     * @return 返回处理后的pageInfo
     */
    public static <PO, VO> PageInfoResult<VO> of(PageInfo<PO> pageInfo, Function<PO, VO> mapper) {
        return new PageInfoResult<>(
                pageInfo.getPageNum(),
                pageInfo.getSize(),
                pageInfo.getTotal(),
                pageInfo.getList().stream().map(mapper).collect(Collectors.toList())
        );
    }

}
